from P1_python_基础.common.utils import *
import yaml
import os


# 定义一个类 Config，用于管理你的配置
class Config:
    # 是类属性，表示“单例对象”，用来保存唯一的实例
    _instance = None

    # __new__ 是 Python 的“对象构造器”，用于控制类对象的创建过程（在 __init__ 之前执行）。
    def __new__(cls, *args, **kwargs):
        # 如果 _instance 为空，则用父类的 __new__ 分配一个对象，并赋值到 _instance，执行一次配置加载
        # 之后每次创建 Config，其实都返回这唯一的实例，保证所有地方用的都是同一个配置对象
        # 这种通过 __new__ 实现单例，是 Python 面试和实际开发最常见、最标准的单例实现方式之一
        if cls._instance is None:
            cls._instance = super(Config, cls).__new__(cls)
            cls._instance.load_config()
        return cls._instance

    def load_config(self):
        if os.environ.get('env') == 'prd':
            with open(os.path.abspath(os.path.join(__file__, '../../../../application.yml')), 'r',
                      encoding="utf-8") as file:
                # 用yaml.safe_load(file)将YAML转成Python对象，赋值给self.config_data
                self.config_data = yaml.safe_load(file)
        else:
            with open(os.path.abspath(os.path.join(__file__, '../../../../application.yml')), 'r',
                      encoding="utf-8") as file:
                self.config_data = yaml.safe_load(file)

    def get_config(self):
        return self.config_data


if __name__ == '__main__':
    # 只会加载一次
    Config()
    Config()

    get_app_config("test.yml_value")
